昨天,我們介紹了 Gitflow,並列舉了在開發推送的過程,而今天,我們終於到了整個 DevOps 的重頭戲,在背後為我們完成自動化 CI/CD 的工具 - Jenkins。
Jenkins 是基於 Java 創建的開源伺服器,並有 Web 的 GUI 可操作,既然是 Java 構建,自然能夠做到跨平台的運行,然而除了免費以外最大的優勢,是他具備超過 1800 + 的 Plugin 可以使用(剛剛看是 1867 個),藉由安裝 Plugin,我們能讓這位老先生轉身變成金剛戰士,為我們完成各種類型的任務。而學習 Jenkins 有兩個點需要特別說明一下,分別是:
先說 Plugin 的管理,由於 Jenkins 是開源的,等於 Plugins 會出自往大的社群之手,而有些時候 Plugins 可能會有潛在的弱點 (Vulnerability),會需要留意去更新;另一方面是 Plugins 之間可能會相互影響導致執行時異常,也是有可能會遇到的坑(不過他免費)。
另外是搭建的方法,目前主流的有兩種,第一種是利用 war 的形式啟動,由於 Jenkins 是基於 Java 創建的,在執行的時候主機需要有 JDK 的環境才能夠運行,而最低的 JDK 版本要 7 以上。
既然能夠以 war 檔案啟動,則自然可以包成 container,利用拉取官方帶有 jdk 和 Jenkins 的鏡像以 container 的方式啟動,內部自行帶有 Jdk 環境,也就是第二種方法。
而藉由 Container 的方式啟動在 Kubernetes 的環境內還能達到非常優雅的分散式構建,又叫 master-worker (過往叫做 master-slave,但被正名了),運作概念是當有建構需求的時候,Jenkins Container (常駐的) 會喚醒更多的 Jenkins Container (worker) 協助任務,而 Container 能夠被分配到不同的機器(worker node)上運行,當完成後再將 Container 關閉,以達到資源的掌控。
Jenkins 在執行的時候,事實上就是在我們的 Linux 上,完成我們前幾天所做的事情,包含:
以上的流程在日後都會是固定的,程式碼就像是水流在水管內一樣經歷了很多個步驟的接力,才完成部署,所以被稱作 Pipeline。
而要讓 Jenkins 能夠打包編譯,等於需要給予 Jenkins 一個空間存放與執行檔案(如原始碼),以前面的方法一會在 Linux 的 jenkins/workspace 資料夾內進行;若使用 Container 建構,由於容器在移除時內部的資料會跟著消失,因此還需要將容器內的資料夾映射到 Linux 機的某個資料夾上,若要讓 Jenkins 在容器內運行並啟用 docker,也需要額外映射。
明天,我們會正式安裝 Jenkins,並且安裝相關的 Plugin,然後逐步的完成 CI/CD 的步驟。而現在,就留給我一點時間先在 Gitlab 上開立三個 Repository,並將他 clone 到我的電腦上,為明天的自動化構建做好準備。
而關於 Gitlab Repository 的創見和 SourceTree clone 的步驟則不介紹,後續將從 webhook & gitflow 的建立開始介紹。
Jenkins 是基於 Java 創建的開源伺服器,並有 Web 的 GUI 可操作
Jenkins 可以由 war 部署,亦可用 Container 部署
Jenkins 很愛 Cosplay,現在在官方網站上可以看到支持烏克蘭的 logo;另外如果操作的時候一直構建失敗或是出現錯誤時,Jenkins 會從和藹的老先生變成噴火的紅惡魔
今天快速地介紹了 Jenkins 的運作機制,而後續 Jenkins 預計會配 2 天上下來打造與解說 pipeline。